# 引入适当的模块
import matplotlib.pyplot as plt
from skimage import io
from mpl_toolkits.mplot3d import Axes3D

# 1. 读入moon.jpg的RGB图
img = io.imread("moon.jpg")

# 2. 把所有的点的RGB三个通道均拉成一条线，作为x,y,z轴的值，在3D空间中构建点
# pt_cnt 控制要从图像中采样(抽取)多少个像素
# 如果抽取的太多，图像的绘制会过久
pt_cnt=1000

# 求出如果想要采样(pt_cnt)个像素点的话，想要横跨所有像素，需要的步长是多少
step = int(img.shape[0] * img.shape[1] / pt_cnt)

x = img[:, :, 0].ravel()[ :: step] # 把红色通道拉直，从第1个像素到最后一个像素，平均步长采样pt_cnt个值
y = img[:, :, 1].ravel()[ :: step] # 把绿色通道拉直，从第1个像素到最后一个像素，平均步长采样pt_cnt个值
z = img[:, :, 2].ravel()[ :: step] # 把蓝色通道拉直，从第1个像素到最后一个像素，平均步长采样pt_cnt个值

fig = plt.figure(figsize=(16,8)) # 制作一个宽16高8的画板
ax = fig.add_subplot(121, projection='3d') # 在画板上1添加1个3D空间子图
ax.view_init(elev=-60, azim=0) # 仰角-60°, 转动角度45°
ax.scatter(x,  # 所有的 r 采样值
           y,  # 所有的 g 采样值
           z)  # 所有的 b 采样值

ax = fig.add_subplot(122, projection='3d') # 在画板上2添加1个3D空间子图
ax.view_init(elev=30, azim=10) # 仰角35°, 转动角度45°
ax.scatter(x,  # 所有的 r 采样值
           y,  # 所有的 g 采样值
           z)  # 所有的 b 采样值

plt.tight_layout() # 调整子图位置
# plt.show()

# 以最紧凑模式保存显示内容到 out.png
plt.savefig('out.png', bbox_inches = 'tight')
plt.show()